package com.cross.sqlite;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.sql.Types;

import com.cross.core.Column;
import com.cross.core.Header;
import com.cross.core.Item;
import com.cross.jdbc.SimpleJdbcWriter;
import com.cross.util.ItemType;

/**
 * SQLitejdbc写入器
 * 
 * @author www
 * 
 */
public class SimpleSQLiteJdbcWriter extends SimpleJdbcWriter {
	
	/**
	 * 构造方法
	 * @param con
	 * @param header
	 * @throws SQLException
	 */
	public SimpleSQLiteJdbcWriter(Connection con, Header header) throws SQLException {
		super(con, header);
	}

	/**
	 * 写入一行
	 * 
	 * @throws SQLException
	 */
	protected void writeRowImpl() throws SQLException {
		String type ;
		int parameterIndex = 0;
		
		for(Column c : header.getColumns()){
			type = c.getType();
			if(ItemType.TYPE_STRING.equalsIgnoreCase(type)){
				preparedStatement.setString(parameterIndex+1, currentRow.getItem(parameterIndex).getString());
			} else if(ItemType.TYPE_DATE.equalsIgnoreCase(type)){
				preparedStatement.setObject(parameterIndex+1, currentRow.getItem(parameterIndex).get());
			} else if(ItemType.TYPE_TIME.equalsIgnoreCase(type)){
				preparedStatement.setTime(parameterIndex+1, currentRow.getItem(parameterIndex).getTime());
			} else if(ItemType.TYPE_TIMESTAMP.equalsIgnoreCase(type)){
				Timestamp timestamp = currentRow.getItem(parameterIndex).getTimestamp();
				if(timestamp == null){
					preparedStatement.setNull(parameterIndex+1, Types.TIMESTAMP);
				} else {
					preparedStatement.setTimestamp(parameterIndex+1, timestamp);
				}
			} else if(ItemType.TYPE_SHORT.equalsIgnoreCase(type)){
				preparedStatement.setShort(parameterIndex+1, currentRow.getItem(parameterIndex).getShort());
			} else if(ItemType.TYPE_FLOAT.equalsIgnoreCase(type)){
				preparedStatement.setFloat(parameterIndex+1, currentRow.getItem(parameterIndex).getFloat());
			} else if(ItemType.TYPE_LONG.equalsIgnoreCase(type)){
				preparedStatement.setLong(parameterIndex+1, currentRow.getItem(parameterIndex).getLong());
			} else if(ItemType.TYPE_INTEGER.equalsIgnoreCase(type)){
				preparedStatement.setInt(parameterIndex+1, currentRow.getItem(parameterIndex).getInteger());
			} else if(ItemType.TYPE_DOUBLE.equalsIgnoreCase(type)){
				preparedStatement.setDouble(parameterIndex+1, currentRow.getItem(parameterIndex).getDouble());
			} else if(ItemType.TYPE_NUMBER.equalsIgnoreCase(type)){
				Number number = currentRow.getItem(parameterIndex).getNumber();
				if(number == null){
					preparedStatement.setNull(parameterIndex+1, Types.NUMERIC);
				} else {
					preparedStatement.setDouble(parameterIndex+1, currentRow.getItem(parameterIndex).getNumber().doubleValue());
				}
			} else if(ItemType.TYPE_BOOLEAN.equalsIgnoreCase(type)){
				Item item = null;
				Boolean b = null;
				item = currentRow.getItem(parameterIndex);
				b = item.getBoolean();
				if(b == null){
					preparedStatement.setNull(parameterIndex+1, Types.BOOLEAN);
				} else {
					//与父类的差别:父类preparedStatement.setBoolean(parameterIndex+1, b);
					preparedStatement.setString(parameterIndex+1, b?"Y":"N");
				}
			} else if(ItemType.TYPE_BYTE.equalsIgnoreCase(type)){
				Byte b = currentRow.getItem(parameterIndex).getByte();
				if(b == null){
					preparedStatement.setNull(parameterIndex+1, Types.CHAR);
				} else {
					preparedStatement.setByte(parameterIndex+1, b.byteValue());
				}
			} else if(ItemType.TYPE_CHARACTER.equalsIgnoreCase(type)){
				preparedStatement.setString(parameterIndex+1, currentRow.getItem(parameterIndex).getCharacter()+"");
			} else {
				preparedStatement.setObject(parameterIndex+1, currentRow.getItem(parameterIndex).get());
			}
			parameterIndex++;
		}
		preparedStatement.execute();
	}
}
